<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;
use frontend\modules\yii2\widgets\layouts\example\Example;
use yii\bootstrap\Button;
use yii\bootstrap\Alert;

$this->title = 'Docker的安装和使用教程';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'docker,container,容器,使用方法,教程,安装'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => '对Docker进行简单的介绍，包括安装和使用教程'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);

$html = [
    "markdown0" => <<<M0
# Docker的安装和使用教程
在介绍如果基于`Docker`安装`Yii`框架之前，非常有必要介绍一下`Docker`的基本概念，因为并不是所有开发者都熟悉`Docker`，但是如果你想成为一名合格的`Phper`，那你必须掌握`Docker`，这也是后续学习以容器方式安装`Yii`框架的基础。

## Docker是什么
`Docker`是一种容器，具有如下几个特点：
- 运行`Docker`的系统开销极低；
- 通常每种服务对应于一个容器，如：php,mysql,nginx,redis都有对应的容器；
- 使用容器的主要目的是为了封装安装服务软件的细节，做到一人发布全球使用；
- 每个容器都是一个运行于宿主机上的独立的子系统；
- 可以把运行在任意时刻的容器打包成镜像发布，镜像可以迁移到所有安装有`Docker`的宿主机中，实现跨平台；

## Docker的安装
如果大家是windows系统，建议安装Linux虚拟机，在Linux上安装Docker：
```shell
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
```

## Docker的常用命令

| 命令 | 含义 |
|---|---|
| [docker pull](#catalogue4) | 拉取镜像 |
| [docker run](#catalogue5) | 拉取镜像并运行实例 |
| docker start | 启动处于stop状态的容器 |
| docker stop | 停止运行容器 |
| docker rm | 删除停止后的容器实例 |
| docker rmi | 删除容器镜像，释放本地空间 |
| docker exec | 在宿主机运行容器内部的命令 |
| docker ps | 查看运行中的容器 |
| docker ps -a | 查看运行中和已停止的容器 |
| docker images | 查看已经拉取到本地的容器镜像 |
| [docker network](#catalogue6) | 容器网络管理，IP管理 |

### docker pull
从指定的镜像仓库中拉取镜像到本地，如果没有指定镜像仓库地址，默认从`https://hub.docker.com/`中拉取：

| 命令 | 含义 |
|---|---|
| docker pull php | 拉取php镜像，由于没有指定镜像版本，默认为：latest |
| docker pull php:latest | 拉取php的镜像，和上面一条命令等效 |
| docker pull php:7.4-fpm | 拉取指定版本的php镜像 |

### docker run
基于拉取的镜像创建一个容器实例并运行它，如果镜像没有拉取则会先拉取镜像，举例如下：
```shell
docker run -itd --name php7 -p 80:80 -v \$PWD:/app php:7.4-fpm
```
这个命令含有的参数比较多，常用的如下：

| 参数 | 举例 | 含义 |
|---|---|---|
| -v | /srv/www:/app | 把宿主机中`/srv/www`目录映射到容器中`/app`目录 |
| -p | 8080:80 | 把宿主机的`8080`端口映射到容器的`80`端口 |
| -d | 无参数 | 表示后台运行容器，并返回容器ID |
| --name | myPhp | 容器实例的名称，不能和别的容器名称一样 |
| --network | myNet | 你需要先创建myNet网络 |

### docker network
用于网络管理的docker命令:
```shell
#查看现有网络
docker network ls

#创建自定义网络
docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 smart

#查看某个网络的详细信息
docker network inspect smart

#删除网络
docker network rm smart
```
有了自定义的网络后就可以在`docker run`中使用了，使用自定义网络的主要原因是将一组服务的所有容器都放到同一个网络中实现静态化IP，有利于容器间通信的配置：
```shell
docker run -itd --name php-network --network smart --ip 172.18.0.10 ubuntu:latest
```

## docker-compose id=docker-compose
`docker-compose`是一个二进制的容器管理工具。我们知道一个web服务可能由php、mysql、nginx、redis等服务构成，每个服务都会对应一个容器，容器之间必然存在依赖关系，如：php容器需要依赖mysql和redis，容器之间也会进行通信，如果我们手动依次启动容器必将很繁琐，此时`docker-compose`就可以排上用场。

### 安装
`docker-compose`的安装：
```
sudo curl -L "https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo link -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```
> 2.1.1是当前（2021年11月12日）的最新版本，如果出后续版本，你可以把2.1.1替换掉即可。

最新的`docker-compose`会被发布到Github，我在国内Gitee也同步了一份：    

| 平台 | Url |
|---|---|
| Github | https://github.com/docker/compose/releases |
| Gitee | https://gitee.com/lvzmen_github/docker-compose/releases |

### 启动
我们将创建容器的配置（如：端口、网络、名字、宿主机文件映射等）和容器的依赖关系都写在`docker-compose.yml`文件中，只需要通过如下命令就可以启动一个容器组：
```
docker-compose -f docker-compose.yml up -d
```
如果命令行当前的目录包含了`docker-compose.yml`，则可以简写成：
```
docker-compose up -d
```
> 注意：-d 参数是值在后台运行容器启动，如果你想看看启动时是否有报错，可以把-d去掉。

M0,
];

foreach($html as $name => $item){
    switch ($name) {
        case strpos($name, "example") !== false:
            echo Example::widget($item);
            break;
        case strpos($name, "markdown") !== false:
            echo Markdown::widget(["content" => $item]);
            break;
        default:
            break;
    }
}